# - inputs: none
# - outputs: all sources coming from data, research and guesswork
chunk_sources <- function(){
###############################################################################
###############################################################################
#############
##### Setup
#############
nsims_so <- 1e4
policy_estimate_so <- "Main Equation"
rescale_so <- TRUE
#############
##### Data
#############
# Create objects for data extracted from various sources
r_input1_so <- 0.1
r_input2_so <- 0.2
#############
##### Research
#############
# Create objects for parameters extracted from research papers
q_input1_so <- 0.5
q_input2_so <- 0.8
#############
##### Guess work
#############
# Create objects for variables from educated guesses or estimates
#############
##### Notes:
#############
# Notes for the objects defined above, including sources, explanations, etc.
k_input1_so <- 3
k_input2_so <- 4
#return( sapply( ls(pattern= "_so\\b"), function(x) get(x)) )
return (
list("nsims_so" = nsims_so,
"policy_estimate_so" = policy_estimate_so,
"rescale_so" = rescale_so,
"r_input1_so" = r_input1_so,
"r_input2_so" = r_input2_so,
"q_input1_so" = q_input1_so,
"q_input2_so" = q_input2_so,
"k_input1_so" = k_input1_so,
"k_input2_so" = k_input2_so
)
)
}
invisible(list2env(chunk_sources(),.GlobalEnv) )
Introduction
Summary of the issue and introduction to the policy analysis is conducted.
The goal of this analysis is to provide the best empirical information for policy makers debating the implemention of “x” policy. This document describes all the analytical steps required to reproduce the analysis, and displaying the actual computer code use in each step. In addition to this report, the reader can find all the materials to reproduce the findings presented here in GitHub. The main output, presented in the results section of this report, can also be explored interactively for different assumptions on the corresponding shiny app.
Key policy estimates for policy makers
???
Methodology
Explain what the final estimate indicator is, how the analysis is to be performed, what factors are looked at, etc.
Common Structure
Introduce the starting point and the final policy estimate. Include alternative indicators of our final policy estimates as well.
Main Equation (the model)
Explanation for the main equation
Show all the details
\[\begin{equation}
y = r + q - k
\label{eq:1}
\tag{1}
\end{equation}\]
Where:
- \(y\): one-liner to define y
- \(r\): one-liner to define r
- \(k\): one-liner to define k
Alternative Equation
Explanation for the alternative equation
Show all the details
\[\begin{equation}
y = r + q + k
\label{eq:2}
\tag{2}
\end{equation}\]
Where:
- \(y\): one-liner to define y
- \(r\): one-liner to define r
- \(k\): one-liner to define k
Sub Common Components:
Component 1 (“\(r\)”)
This is the formula used to calculate component 1
Show all the details
\[\begin{equation}
r = X \times \lambda_1 + (1 - X) \times \lambda_2
\label{eq:3}
\tag{3}
\end{equation}\]
Where:
- \(r\): one-liner for r
- \(X\): one-liner for X
- \(\lambda_1\): one-liner for \(\lambda_1\)
- \(\lambda_2\): one-liner for \(\lambda_2\)
Approach 1: Source Name (source link)
Component 2 (“\(q\)”)
This is the formula used to calculate component 2
Show all the details
\[\begin{equation}
q = \text{input} \times \alpha_0 (1 + g)^{X}(1 + \hat{\beta_1} X + \hat{\beta_2} X^2)
\label{eq:}
\tag{4}
\end{equation}\]
Where:
- \(q\): one-liner to define q
- \(\alpha_0\): one-liner to define \(\alpha_0\)
- \(g\): one-liner to define g
- \(\hat{\beta_1}\): one-liner to define \(\hat{\beta_1}\)
- \(\hat{\beta_2}\): one-liner to define \(\hat{\beta_2}\)
Approach 2: Source Name (source link)
Component 3 (“\(k\)”)
This is the formula used to calculate component 3
Show all the details
\[\begin{equation}
k = R \times X + (1 - R) \times X
\label{eq:5}
\tag{5}
\end{equation}\]
Where:
- \(k\): one-liner to define k
- \(R\): one-liner to define R
Summary of All Approaches
| 1.1 |
Specification of Approach 1 with Part 1 Assumption 1 |
Specification of Approach 1 with Part 2 Assumption 1 |
| 1.2 |
Specification of Approach 1 with Part 1 Assumption 2 |
Specification of Aprroach 1 with Part 2 Assumption 2 |
| 2.1 |
Specification of Approach 2 with Part 1 Assumption 1 |
Specification of Approach 2 with Part 2 Assumption 1 |
| 2.2 |
Specification of Approach 2 with Part 1 Assumption 2 |
Specification of Approach 2 with Part 2 Assumption 2 |
Bolded row is the assumptions and the approach we use to generate the main policy estimate plot.
Main results
Show all the details
#unit test function
unit_test_f <- function(to_test_var, original_var, main_run_var = TRUE){
if (main_run_var == TRUE) {
if (length(to_test_var) > 1) {
fails_test <- ( abs(sd(to_test_var) - original_var) > 0.0001 )
text_val <- sd(to_test_var)
} else {
fails_test <- ( abs(to_test_var - original_var) > 0.0001 )
text_val <- to_test_var
}
if (fails_test) {
print(paste("Output has change at",
deparse(substitute(to_test_var) ),
" to ", text_val) )
}
}
}
one_run <-
function(r_input1_var1 = r_input1_so,
r_input2_var1 = r_input2_so,
q_input1_var1 = q_input1_so,
q_input2_var1 = q_input2_so,
k_input1_var1 = k_input1_so,
k_input2_var1 = k_input2_so){# Variables needed to generate the final policy estimates
r_in <- r_function_f(r_input1_var = r_input1_var1,
r_input2_var = r_input2_var1)
q_in <- q_function_f(q_input1_var = q_input1_var1,
q_input2_var = q_input2_var1)
k_in <- k_function_f(k_input1_var = k_input1_var1,
k_input2_var = k_input2_var1)
return (list("r_in" = r_in,
"q_in" = q_in,
"k_in" = k_in))
}
invisible(list2env(one_run(), .GlobalEnv))
# - perform the calculations to achieve final results
result1 <- mainequation_f(r_final_var = r_in,
q_final_var = q_in,
k_final_var = k_in)
result2 <- alternative_f(r_final_var = r_in,
q_final_var = q_in,
k_final_var = k_in)
#...
results_table <- data.frame("results1" = c("results", NA,
NA) ,
"results2" = c(NA, "results", NA),
"results3" = c("results", NA,
"results"),
row.names = c("situation1", "situation2", "situation3"))
kable(results_table, caption = "Table Caption") %>%
kable_styling("striped", full_width = F)
Table 3.1: Table Caption
|
|
results1
|
results2
|
results3
|
|
situation1
|
results
|
NA
|
results
|
|
situation2
|
NA
|
results
|
NA
|
|
situation3
|
NA
|
NA
|
results
|
Monte Carlo Simulations
sim_data1_f <- function(nsims = 1e2,
r_input1_var2,
r_input1_var2_sd,
r_input2_var2,
r_input2_var2_sd,
q_input1_var2,
q_input1_var2_sd,
q_input2_var2,
q_input2_var2_sd,
k_input1_var2,
k_input1_var2_sd,
k_input2_var2,
k_input2_var2_sd){
################
###### Draws
################
start_time <- Sys.time()
set.seed(142857)
r1_sim <- rnorm(n = nsims, mean = r_input1_var2, sd= r_input1_var2_sd)
r2_sim <- rnorm(n = nsims, mean = r_input2_var2, sd= r_input2_var2_sd)
q1_sim <- rnorm(n = nsims, mean = q_input1_var2, sd= q_input1_var2_sd)
q2_sim <- rnorm(n = nsims, mean = q_input2_var2, sd= q_input2_var2_sd)
k1_sim <- rnorm(n = nsims, mean = k_input1_var2, sd= k_input1_var2_sd)
k2_sim <- rnorm(n = nsims, mean = k_input2_var2, sd= k_input2_var2_sd)
################
###### Runs
################
result1_sim <- rep(NA, nsims) #result1
result2_sim <- rep(NA, nsims) #result2
for (i in 1:nsims){
invisible(list2env(
one_run(r_input1_var1 = r1_sim[i],
r_input2_var1 = r2_sim[i],
q_input1_var1 = q1_sim[i],
q_input2_var1 = q2_sim[i],
k_input1_var1 = k1_sim[i],
k_input2_var1 = k2_sim[i]
), .GlobalEnv))
result1_sim[i] <- mainequation_f(r_final_var = r_in,
q_final_var = q_in,
k_final_var = k_in)
result2_sim[i] <- alternative_f(r_final_var = r_in,
q_final_var = q_in,
k_final_var = k_in)
}
total_time <- Sys.time() - start_time
return(list("result1_sim" = result1_sim,
"result2_sim" = result2_sim))
}
policy_estimates_varnames <- c(
"result1_sim",
"result2_sim"
)
policy_estimates_text <- c(
"Main Equation",
"Alternative Equation"
)
# Run Monte Carlo simulation for our main model
result1_sim_all <- sim_data1_f(nsims = nsims_so,
r_input1_var2 = r_input1_so,
r_input1_var2_sd = r_input1_so * 0.1,
r_input2_var2 = r_input2_so,
r_input2_var2_sd = r_input2_so * 0.1,
q_input1_var2 = q_input1_so,
q_input1_var2_sd = q_input1_so * 0.1,
q_input2_var2 = q_input2_so,
q_input2_var2_sd = q_input2_so * 0.1,
k_input1_var2 = k_input1_so,
k_input1_var2_sd = k_input1_so * 0.1,
k_input2_var2 = k_input2_so,
k_input2_var2_sd = k_input2_so * 0.1
)
################
###### Results/Viz
################
library(plotly)
plot1 <- generate_plot_f(result1_sim_all, policy_estimate_so, rescale_so)[[1]] +
labs(y = NULL,
x = "Main Estimate" ,
title = "Project Title",
subtitle = "Distribution of Key Indicator"
)
print(plot1)

References
LS0tDQp0aXRsZTogIjxjZW50ZXI+PGRpdiBjbGFzcz0gJ215dGl0bGUnPlRlbXBsYXRlPC9kaXY+PC9jZW50ZXI+Ig0KZGF0ZTogIjxjZW50ZXI+PGRpdiBjbGFzcz0nbXlzdWJ0aXRsZSc+YHIgZm9ybWF0KFN5cy50aW1lKCksICclZCAlQiwgJVknKWA8L2Rpdj48L2NlbnRlcj4iDQphdXRob3I6ICI8Y2VudGVyPjxkaXYgY2xhc3MgPSAnY29udHJpYnV0b3JzJz5Db250cmlidXRvcnM8L2Rpdj48L2NlbnRlcj4iDQpvdXRwdXQ6DQogIGJvb2tkb3duOjpodG1sX2RvY3VtZW50MjoNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjc3M6IHN0eWxlLmNzcw0KICAgIGhpZ2hsaWdodDogdGFuZ28NCiAgICBpbmNsdWRlczoNCiAgICAgIGFmdGVyX2JvZHk6IGZvb3Rlci5odG1sDQogICAga2VlcF9tZDogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICBzbW9vdGhfc2Nyb2xsOiBubw0KICAgIHRoZW1lOiBjZXJ1bGVhbg0KICAgIHRvYzogeWVzDQogICAgdG9jX2NvbGxhcHNlZDogbm8NCiAgICB0b2NfZGVwdGg6IDMNCiAgICB0b2NfZmxvYXQ6IHllcw0KICBodG1sX2RvY3VtZW50Og0KICAgIGRmX3ByaW50OiBwYWdlZA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiAnMycNCiAgd29yZF9kb2N1bWVudDogbnVsbA0KbGluay1jaXRhdGlvbnM6IHllcw0KcGRmX2RvY3VtZW50Og0KICBleHRyYV9kZXBlbmRlbmNpZXM6IHhjb2xvcg0KICBmaWdfY2FwdGlvbjogbm8NCmJpYmxpb2dyYXBoeTogYmlibGlvZ3JhcGh5LmJpYg0KDQprbml0OiANCiAgIyByZW5kZXIgdG8gaW5kZXguaHRtbCBmb3IgR2l0SHViIHBhZ2VzDQogICMgcmVuZGVyIHRvIDA1X2ZpbmFsX29wYS5odG1sIHRvIGtuaXQgbG9jYWxseQ0KICAjIFlBTUwgZG9lcyBub3Qgc3VwcG9ydCBjb21tZW50aW5nIGluc2lkZSB0aGUgZnVuY3Rpb24NCiAgKGZ1bmN0aW9uKGlucHV0X2ZpbGUsIGVuY29kaW5nKSB7DQogIHJtYXJrZG93bjo6cmVuZGVyKGlucHV0X2ZpbGUsIGVuY29kaW5nPWVuY29kaW5nLCBvdXRwdXRfZmlsZT1maWxlLnBhdGgoIi4uIiwgJ2luZGV4Lmh0bWwnKSk7IA0KICBybWFya2Rvd246OnJlbmRlcihpbnB1dF9maWxlLCBlbmNvZGluZz1lbmNvZGluZywgb3V0cHV0X2ZpbGU9JzAwX3RlbXBsYXRlLmh0bWwnKTsgDQogIH0pDQotLS0NClxkZWZcYmx1ZXtcY29sb3J7Ymx1ZX19DQpcZGVmXHJlZHtcY29sb3J7cmVkfX0NCg0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRSwgcHVybCA9IEZBTFNFfSANCiMgTG9hZGluZyByZXF1aXJlZCBsaWJyYXJpZXMNCmxpc3Qub2YucGFja2FnZXMgPC0gYygidGlkeXZlcnNlIiwgImhlcmUiLCAia2FibGVFeHRyYSIsICJyZWFkeGwiLCJwbG90bHkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgImJvb2tkb3duIiwgInJvb3RTb2x2ZSIsInNoaW55QlMiLCAic2hpbnl0aGVtZXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgImdncGxvdDIiKQ0KDQpuZXcucGFja2FnZXMgPC0gbGlzdC5vZi5wYWNrYWdlc1shKGxpc3Qub2YucGFja2FnZXMgJWluJSBpbnN0YWxsZWQucGFja2FnZXMoKVssIlBhY2thZ2UiXSldDQppZihsZW5ndGgobmV3LnBhY2thZ2VzKSkgaW5zdGFsbC5wYWNrYWdlcyhuZXcucGFja2FnZXMsIHJlcG9zPSAiaHR0cDovL2NyYW4uY25yLmJlcmtlbGV5LmVkdS8iKQ0KDQpsYXBwbHkobGlzdC5vZi5wYWNrYWdlcywgbGlicmFyeSwgY2hhcmFjdGVyLm9ubHkgPSBUUlVFKQ0KDQprbml0cjo6b3B0c19rbml0JHNldChyb290LmRpciA9IGhlcmUoKSkNCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCg0Kc2V0d2QoaGVyZSgpKQ0KDQojIFB1cmwgdG8gYWxsX2FuYWx5c2lzLlINCm9wdGlvbnMoa25pdHIuZHVwbGljYXRlLmxhYmVsID0gImFsbG93IikgIyB3b3JrYXJvdW5kIGZvciBwdXJsIGVycm9yDQprbml0cjo6cHVybCgiY29kZS8wMF90ZW1wbGF0ZS5SbWQiLCAiY29kZS9zaGlueV9hcHAvYWxsX2FuYWx5c2lzLlIiKQ0KDQpwcmludF9jb2RlIDwtIFRSVUUNCmBgYCANCg0KDQpgYGB7ciBwYXJhbWV0ZXJzLCBlY2hvPXByaW50X2NvZGV9DQojIERvIG5vdCBydW4gZGF0YSBzZXQgb24gZ2l0L2dpdGh1YiB1bnRpbCBwcml2YWN5IGhhcyBiZWVuIGNsZWFyZWQNCiMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIERhdGEgIA0KIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMgUmVzZWFyY2gNCiMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIEd1ZXNzIHdvcmsgICANCiMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjICBOb3RlczoNCiMjIyMjIyMjIyMjIyMjIyMNCiMjIyBTb3VyY2UgLS0tLT4gIElucHV0IC0tLS0+IE1vZGVsIC0tLS0+IFBvbGljeSBFc3RpbWF0ZXMgKG91dHB1dCkNCiMjIyAgKF9zbykgICAgICAgIChfaW4pICAgICAgIChfbW8pICAgICAgICAoX3BlKQ0KIyMjIHZhbHVlcyAgICAgIGZ1bmN0aW9ucyAgIGZ1bmN0aW9ucyAgICAgIHZhbHVlcw0KIyMjICAgICAgICAgICAgICYgdmFsdWVzICAgICYgdmFsdWVzDQojIyMgYXJndW1lbnRzIGluIGZ1bmN0aW9ucyBzaG91bGQgdXNlZCAiX3ZhciIgYW5kIGZ1bmN0aW9ucyBzaG91bGQgIl9mIg0KI2ludmlzaWJsZSggbGlzdDJlbnYoY2FsbF9wYXJhbXNfZigpLC5HbG9iYWxFbnYpICkNCg0KDQojIEVhY2ggYW5hbHl0aWMgY29kZSBjaHVuayB3aWxsIGJlZ2luIGJ5IGxpc3RpbmcgYWxsIHRoZSBpbnB1dHMgaXQgbmVlZHMsIGFuZA0KIyB0aGUgb3V0cHV0cyBpdCBwcm9kdWNlcy4NCiMgLSBpbnB1dHM6IGxpc3QNCiMgLSBvdXRwdXRzOiBsaXN0DQojIyMjIFRoZSBrZXkgZXNzZW50aWFsIGFuYWx5dGljIHN0ZXBzIGFyZSB3cmFwdGVkIGluIGEgZnVuY3Rpb24gICANCiNjaHVua19uYW1lX29mX2NodW5rIDwtIGZ1bmN0aW9uKCl7DQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgDQojDQojIGhlcmUgZ29lcyB0aGUgZXNzZW50aWFsIGFuYWx5dGljIGNvbnRlbnQNCiMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICANCiMgICAgcmV0dXJuKCApICAgICAgICAgICAgICAgICAgICAgICAgICMgQSBsaXN0IHdpdGggYWxsIHRoZSBvYmplY3RzDQojfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGdlbmVyYXRlZCBpbnNpZGUgdGhlIGZ1bmN0aW9uDQojIFRoZSBmb2xsb3dpbmcgbGluZSBleGVjdXRlcyB0aGUgY29kZSBjaHVuayBhbmQgZGVwb3NpdHMgaXRzIHJlc3VsdHMNCiMgaW50byB0aGUgY3VycmVudCBSIGVudmlvcm5tZW50Og0KI2ludmlzaWJsZSggbGlzdDJlbnYoY2h1bmtfbmFtZV9vZl9jaHVuaygpLC5HbG9iYWxFbnYpICkNCiMNCiMjIyMjIEV4ZWN1dGUgdmFsdWVzIG9mIHRoZSBmdW5jdGlvbnMgYWJvdmUgd2hlbiBuZWVkZWQgZm9yIHRoZSB0ZXh0Og0KIyBBbnl0aGluZyB1bmRlciB0aGlzIGNvbW1lbnQgaXMgdG8gY3JlYXRlIG9iamVjdHMgdGhhdCBhcmUgdXNlZCBpbiB0aGUgYm9keSBvZg0KIyB0ZXh0LiBOb3QgdG8gYmUgdXNlZCBpbiB0aGUgZmluYWwgcmVzdWx0cyAoY291bGQgYmUgZGVsZXRlZCkuIEVhY2ggb2YgdGhlc2UNCiMgb2JqZWN0IHNob3VsZCBlbmQgd2l0aCB0aGUgc3VmZml4IF90ZW1wDQoNCmBgYA0KDQoNCmBgYHtyIHNvdXJjZXMsIGV2YWwgPSBUUlVFLCBlY2hvPXByaW50X2NvZGUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIC0gaW5wdXRzOiBub25lDQojIC0gb3V0cHV0czogYWxsIHNvdXJjZXMgY29taW5nIGZyb20gZGF0YSwgcmVzZWFyY2ggYW5kIGd1ZXNzd29yaw0KY2h1bmtfc291cmNlcyA8LSBmdW5jdGlvbigpew0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KICANCiAgICAjIyMjIyMjIyMjIyMjDQogICAgIyMjIyMgU2V0dXANCiAgICAjIyMjIyMjIyMjIyMjICANCiAgICBuc2ltc19zbyA8LSAxZTQNCiAgICBwb2xpY3lfZXN0aW1hdGVfc28gPC0gIk1haW4gRXF1YXRpb24iDQogICAgcmVzY2FsZV9zbyA8LSBUUlVFDQogICAgIyMjIyMjIyMjIyMjIw0KICAgICMjIyMjIERhdGEgIA0KICAgICMjIyMjIyMjIyMjIyMNCiAgICANCiAgIyBDcmVhdGUgb2JqZWN0cyBmb3IgZGF0YSBleHRyYWN0ZWQgZnJvbSB2YXJpb3VzIHNvdXJjZXMNCiAgICANCiAgICByX2lucHV0MV9zbyA8LSAwLjENCiAgICByX2lucHV0Ml9zbyA8LSAwLjINCiAgICAjIyMjIyMjIyMjIyMjDQogICAgIyMjIyMgUmVzZWFyY2gNCiAgICAjIyMjIyMjIyMjIyMjDQogIA0KICAjIENyZWF0ZSBvYmplY3RzIGZvciBwYXJhbWV0ZXJzIGV4dHJhY3RlZCBmcm9tIHJlc2VhcmNoIHBhcGVycyANCiAgICBxX2lucHV0MV9zbyA8LSAwLjUNCiAgICBxX2lucHV0Ml9zbyA8LSAwLjgNCiAgICAjIyMjIyMjIyMjIyMjDQogICAgIyMjIyMgR3Vlc3Mgd29yayAgIA0KICAgICMjIyMjIyMjIyMjIyMNCiAgDQogICMgQ3JlYXRlIG9iamVjdHMgZm9yIHZhcmlhYmxlcyBmcm9tIGVkdWNhdGVkIGd1ZXNzZXMgb3IgZXN0aW1hdGVzICANCiAgDQoNCiAgICAjIyMjIyMjIyMjIyMjDQogICAgIyMjIyMgTm90ZXM6IA0KICAgICMjIyMjIyMjIyMjIyMNCiAgDQogICMgTm90ZXMgZm9yIHRoZSBvYmplY3RzIGRlZmluZWQgYWJvdmUsIGluY2x1ZGluZyBzb3VyY2VzLCBleHBsYW5hdGlvbnMsIGV0Yy4gDQogICAga19pbnB1dDFfc28gPC0gMw0KICAgIGtfaW5wdXQyX3NvIDwtIDQNCiAgICANCiAgICAjcmV0dXJuKCBzYXBwbHkoIGxzKHBhdHRlcm49ICJfc29cXGIiKSwgZnVuY3Rpb24oeCkgZ2V0KHgpKSApDQogICAgcmV0dXJuICgNCiAgICAgIGxpc3QoIm5zaW1zX3NvIiA9IG5zaW1zX3NvLA0KICAgICAgICAgICAicG9saWN5X2VzdGltYXRlX3NvIiA9IHBvbGljeV9lc3RpbWF0ZV9zbywNCiAgICAgICAgICAgInJlc2NhbGVfc28iID0gcmVzY2FsZV9zbywNCiAgICAgICAgICAgInJfaW5wdXQxX3NvIiA9IHJfaW5wdXQxX3NvLA0KICAgICAgICAgICAicl9pbnB1dDJfc28iID0gcl9pbnB1dDJfc28sDQogICAgICAgICAgICJxX2lucHV0MV9zbyIgPSBxX2lucHV0MV9zbywNCiAgICAgICAgICAgInFfaW5wdXQyX3NvIiA9IHFfaW5wdXQyX3NvLA0KICAgICAgICAgICAia19pbnB1dDFfc28iID0ga19pbnB1dDFfc28sDQogICAgICAgICAgICJrX2lucHV0Ml9zbyIgPSBrX2lucHV0Ml9zbw0KICAgICAgICAgICApDQogICAgKQ0KfQ0KaW52aXNpYmxlKGxpc3QyZW52KGNodW5rX3NvdXJjZXMoKSwuR2xvYmFsRW52KSApDQpgYGANCg0KIyBJbnRyb2R1Y3Rpb24NClN1bW1hcnkgb2YgdGhlIGlzc3VlIGFuZCBpbnRyb2R1Y3Rpb24gdG8gdGhlIHBvbGljeSBhbmFseXNpcyBpcyBjb25kdWN0ZWQuIA0KDQpUaGUgZ29hbCBvZiB0aGlzIGFuYWx5c2lzIGlzIHRvIHByb3ZpZGUgdGhlIGJlc3QgZW1waXJpY2FsIGluZm9ybWF0aW9uIGZvciBwb2xpY3kgbWFrZXJzIGRlYmF0aW5nIHRoZSBpbXBsZW1lbnRpb24gb2YgIngiIHBvbGljeS4gVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgYWxsIHRoZSBhbmFseXRpY2FsIHN0ZXBzIHJlcXVpcmVkIHRvIHJlcHJvZHVjZSB0aGUgYW5hbHlzaXMsIGFuZCBkaXNwbGF5aW5nIHRoZSBhY3R1YWwgY29tcHV0ZXIgY29kZSB1c2UgaW4gZWFjaCBzdGVwLiBJbiBhZGRpdGlvbiB0byB0aGlzIHJlcG9ydCwgdGhlIHJlYWRlciBjYW4gZmluZCBhbGwgdGhlIG1hdGVyaWFscyB0byByZXByb2R1Y2UgdGhlIGZpbmRpbmdzIHByZXNlbnRlZCBoZXJlIGluIEdpdEh1Yi4gVGhlIG1haW4gb3V0cHV0LCBwcmVzZW50ZWQgaW4gdGhlIHJlc3VsdHMgc2VjdGlvbiBvZiB0aGlzIHJlcG9ydCwgY2FuIGFsc28gYmUgZXhwbG9yZWQgaW50ZXJhY3RpdmVseSBmb3IgZGlmZmVyZW50IGFzc3VtcHRpb25zIG9uIHRoZSBjb3JyZXNwb25kaW5nIHNoaW55IGFwcC4gDQoNCiMjIFNvdXJjZSBJbmZvcm1hdGlvbiBmb3IgZGF0YSArIGFuYWx5dGljYWwgbWV0aG9kcw0KDQpGb3IgdGhpcyBkeW5hbWljIGRvY3VtZW50LCB3ZSBhcmUgY29uZHVjdGluZyB0aGlzIHNwZWNpZmljIGFuYWx5c2lzLCBhbmQgaXQgaXMgY29tcHV0ZWQgdXNpbmcgdGhyZWUgZGlmZmVyZW50IGFwcHJvYWNoZXM6DQoNCjEuIEFwcHJvYWNoIDEgKHNvdXJjZSBsaW5rKQ0KMi4gQXBwcm9hY2ggMiAoc291cmNlIGxpbmspDQozLiBBcHByb2FjaCAzIChzb3VyY2UgbGluaykNCg0KDQoNCj8/PyAgDQoNCiMjIEtleSBwb2xpY3kgZXN0aW1hdGVzIGZvciBwb2xpY3kgbWFrZXJzICANCmBgYHtyfQ0KI215IHRob3VnaHRzOiBzaG91bGQgd2UgZm9yZWZyb250IHRoZSBjb25jbHVzaW9ucyBiZWZvcmUgdGhlIG1ldGhvZG9sb2d5PyANCg0KI1NhbmRyYTogSSB0aGluayB3ZSBzaG91bGQgc3BlY2lmeSB3aGljaCBhcHByb2FjaCB3ZSB1c2UgdG8gZ2VuZXJhdGUgdGhlIGdyYXBoLCBidXQga2VlcCB0aGUgbWV0aG9kb2xvZ3kgYmVmb3JlIHRoZSBjb25jbHVzaW9ucy4gDQpgYGANCg0KYGBge3IgZmluYWwtb3V0cHV0fQ0KYGBgDQo/Pz8NCg0KIyBNZXRob2RvbG9neQ0KDQpFeHBsYWluIHdoYXQgdGhlIGZpbmFsIGVzdGltYXRlIGluZGljYXRvciBpcywgaG93IHRoZSBhbmFseXNpcyBpcyB0byBiZSBwZXJmb3JtZWQsIHdoYXQgZmFjdG9ycyBhcmUgbG9va2VkIGF0LCBldGMuDQoNCiMjIENvbW1vbiBTdHJ1Y3R1cmUNCg0KSW50cm9kdWNlIHRoZSBzdGFydGluZyBwb2ludCBhbmQgdGhlIGZpbmFsIHBvbGljeSBlc3RpbWF0ZS4gSW5jbHVkZSBhbHRlcm5hdGl2ZSBpbmRpY2F0b3JzIG9mIG91ciBmaW5hbCBwb2xpY3kgZXN0aW1hdGVzIGFzIHdlbGwuICANCg0KIyMjIE1haW4gRXF1YXRpb24gKHRoZSBtb2RlbCkNCg0KRXhwbGFuYXRpb24gZm9yIHRoZSBtYWluIGVxdWF0aW9uIA0KDQo8ZGV0YWlscz48c3VtbWFyeT5TaG93IGFsbCB0aGUgZGV0YWlsczwvc3VtbWFyeT4NClxiZWdpbntlcXVhdGlvbn0NCnkgPSByICsgcSAtIGsNClxsYWJlbHtlcToxfQ0KXHRhZ3sxfQ0KXGVuZHtlcXVhdGlvbn0NCg0KV2hlcmU6IA0KDQotICR5JDogb25lLWxpbmVyIHRvIGRlZmluZSB5DQotICRyJDogb25lLWxpbmVyIHRvIGRlZmluZSByDQotICRrJDogb25lLWxpbmVyIHRvIGRlZmluZSBrDQoNCjwvZGV0YWlscz4NCg0KDQoNCiMjIyBBbHRlcm5hdGl2ZSBFcXVhdGlvbg0KDQpFeHBsYW5hdGlvbiBmb3IgdGhlIGFsdGVybmF0aXZlIGVxdWF0aW9uIA0KDQo8ZGV0YWlscz48c3VtbWFyeT5TaG93IGFsbCB0aGUgZGV0YWlsczwvc3VtbWFyeT4NClxiZWdpbntlcXVhdGlvbn0NCnkgPSByICsgcSArIGsNClxsYWJlbHtlcToyfQ0KXHRhZ3syfQ0KXGVuZHtlcXVhdGlvbn0NCg0KV2hlcmU6DQoNCi0gJHkkOiBvbmUtbGluZXIgdG8gZGVmaW5lIHkNCi0gJHIkOiBvbmUtbGluZXIgdG8gZGVmaW5lIHINCi0gJGskOiBvbmUtbGluZXIgdG8gZGVmaW5lIGsNCg0KYGBge3IgdGVzdCwgZXZhbD1UUlVFfQ0KIyAtIGlucHV0czogDQojIC0gb3V0cHV0czogDQpjaHVua190ZXN0IDwtIGZ1bmN0aW9uKCl7DQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIA0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgDQogIA0KICAgICMgcmFuZG9tIGVxdWF0aW9uIHRvIHVzZSBhcyBvdXIgbWFpbiBlcXVhdGlvbiB0byBnZXQgdGhlIGZpbmFsIHJlc3VsdA0KICAgIG1haW5lcXVhdGlvbl9mIDwtIGZ1bmN0aW9uKHJfZmluYWxfdmFyID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxX2ZpbmFsX3ZhciA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga19maW5hbF92YXIgPSAxKSB7DQogICAgICAgIHJldHVybiAocl9maW5hbF92YXIgKyBxX2ZpbmFsX3ZhciAtIGtfZmluYWxfdmFyKQ0KICAgIH0NCiAgICANCiAgICAjIHJhbmRvbSBlcXVhdGlvbiB0byB1c2UgYXMgb3VyIGFsdGVybmF0aXZlIGVxdWF0aW9uIHRvIGdldCB0aGUgZmluYWwgcmVzdWx0DQogICAgYWx0ZXJuYXRpdmVfZiA8LSBmdW5jdGlvbiggcl9maW5hbF92YXIgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFfZmluYWxfdmFyID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrX2ZpbmFsX3ZhciA9IDEpew0KICAgICAgcmV0dXJuIChyX2ZpbmFsX3ZhciArIHFfZmluYWxfdmFyICsga19maW5hbF92YXIpDQogICAgICANCiAgICB9DQogICAgDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIA0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgDQogICAgcmV0dXJuKGxpc3QoIm1haW5lcXVhdGlvbl9mIiA9IG1haW5lcXVhdGlvbl9mLCAiYWx0ZXJuYXRpdmVfZiIgPSBhbHRlcm5hdGl2ZV9mKSkgICAgIyBUcnkgdG8gcmV0dXJuIG9ubHkgZnVuY3Rpb25zDQp9DQppbnZpc2libGUoIGxpc3QyZW52KGNodW5rX3Rlc3QoKSwuR2xvYmFsRW52KSApDQoNCiMjIyMjIEV4ZWN1dGUgdmFsdWVzIG9mIHRoZSBmdW5jdGlvbnMgYWJvdmUgd2hlbiBuZWVkZWQgZm9yIHRoZSB0ZXh0Og0KbWFpbmVxdWF0aW9uX2luIDwtIG1haW5lcXVhdGlvbl9mKCkNCmFsdGVybmF0aXZlX2luIDwtIGFsdGVybmF0aXZlX2YoKQ0KYGBgDQoNCg0KPC9kZXRhaWxzPg0KDQojIyBTdWIgQ29tbW9uIENvbXBvbmVudHM6DQoNCiMjIyBDb21wb25lbnQgMSAoIiRyJCIpDQoNClRoaXMgaXMgdGhlIGZvcm11bGEgdXNlZCB0byBjYWxjdWxhdGUgY29tcG9uZW50IDFbXjFdDQoNCjxkZXRhaWxzPjxzdW1tYXJ5PlNob3cgYWxsIHRoZSBkZXRhaWxzPC9zdW1tYXJ5Pg0KXGJlZ2lue2VxdWF0aW9ufQ0KciA9IFggXHRpbWVzIFxsYW1iZGFfMSAgKyAoMSAtIFgpIFx0aW1lcyBcbGFtYmRhXzINClxsYWJlbHtlcTozfQ0KXHRhZ3szfQ0KXGVuZHtlcXVhdGlvbn0NCg0KV2hlcmU6IA0KDQotICRyJDogb25lLWxpbmVyIGZvciByDQotICRYJDogb25lLWxpbmVyIGZvciBYDQotICRcbGFtYmRhXzEkOiBvbmUtbGluZXIgZm9yICRcbGFtYmRhXzEkDQotICRcbGFtYmRhXzIkOiBvbmUtbGluZXIgZm9yICRcbGFtYmRhXzIkDQoNCmBgYHtyIGNvbXAxLCAgZWNobz1wcmludF9jb2RlLCBldmFsPVRSVUV9DQojIC0gaW5wdXRzOiBmYWN0b3JzIG9mIHINCiMgLSBvdXRwdXRzOiByIHZhbHVlDQpjaHVua19yIDwtIGZ1bmN0aW9uKCl7DQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICANCg0KICAgIHJfZnVuY3Rpb25fZiA8LSBmdW5jdGlvbihyX2lucHV0MV92YXIgPSByX2lucHV0MV9zbyAsIHJfaW5wdXQyX3ZhciA9IHJfaW5wdXQyX3NvKSB7ICANCiAgICAgICAgcl9pbnB1dDFfdmFyIC0gcl9pbnB1dDJfdmFyDQogICAgICAgIA0KICAgIH0NCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgDQogICAgcmV0dXJuKGxpc3QoInJfZnVuY3Rpb25fZiIgPSByX2Z1bmN0aW9uX2YpKQ0KfQ0KDQppbnZpc2libGUoIGxpc3QyZW52KGNodW5rX3IoKSwuR2xvYmFsRW52KSApDQoNCmBgYA0KPC9kZXRhaWxzPg0KDQojIyBBcHByb2FjaCAxOiBTb3VyY2UgTmFtZSAoc291cmNlIGxpbmspDQojIyMgQ29tcG9uZW50IDIgKCIkcSQiKQ0KDQpUaGlzIGlzIHRoZSBmb3JtdWxhIHVzZWQgdG8gY2FsY3VsYXRlIGNvbXBvbmVudCAyW14yXQ0KDQo8ZGV0YWlscz48c3VtbWFyeT5TaG93IGFsbCB0aGUgZGV0YWlsczwvc3VtbWFyeT4NClxiZWdpbntlcXVhdGlvbn0NCnEgPSAgXHRleHR7aW5wdXR9IFx0aW1lcyBcYWxwaGFfMCAoMSArIGcpXntYfSgxICsgXGhhdHtcYmV0YV8xfSBYICsgXGhhdHtcYmV0YV8yfSBYXjIpDQpcbGFiZWx7ZXE6fQ0KXHRhZ3s0fQ0KXGVuZHtlcXVhdGlvbn0NCg0KV2hlcmU6IA0KDQotICRxJDogb25lLWxpbmVyIHRvIGRlZmluZSBxDQotICRcYWxwaGFfMCQ6IG9uZS1saW5lciB0byBkZWZpbmUgJFxhbHBoYV8wJA0KLSAkZyQ6IG9uZS1saW5lciB0byBkZWZpbmUgZw0KLSAkXGhhdHtcYmV0YV8xfSQ6IG9uZS1saW5lciB0byBkZWZpbmUgJFxoYXR7XGJldGFfMX0kDQotICRcaGF0e1xiZXRhXzJ9JDogb25lLWxpbmVyIHRvIGRlZmluZSAkXGhhdHtcYmV0YV8yfSQNCg0KDQpgYGB7ciBjb21wMiwgIGVjaG89cHJpbnRfY29kZSwgZXZhbD1UUlVFfQ0KIyAtIGlucHV0czogZmFjdG9ycyBvZiBxDQojIC0gb3V0cHV0czogcSB2YWx1ZQ0KY2h1bmtfcSA8LSBmdW5jdGlvbigpew0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgDQoNCiAgICBxX2Z1bmN0aW9uX2YgPC0gZnVuY3Rpb24ocV9pbnB1dDFfdmFyID0gcV9pbnB1dDFfc28gLCBxX2lucHV0Ml92YXIgPSBxX2lucHV0Ml9zbykgeyAgDQogICAgICAgIChxX2lucHV0MV92YXIgKiBxX2lucHV0Ml92YXIpXjINCiAgICAgICAgDQogICAgfQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICANCiAgICByZXR1cm4obGlzdCgicV9mdW5jdGlvbl9mIiA9IHFfZnVuY3Rpb25fZikpDQp9DQoNCmludmlzaWJsZSggbGlzdDJlbnYoY2h1bmtfcSgpLC5HbG9iYWxFbnYpICkNCg0KYGBgDQo8L2RldGFpbHM+DQoNCiMjIEFwcHJvYWNoIDI6IFNvdXJjZSBOYW1lIChzb3VyY2UgbGluaykNCiMjIyBDb21wb25lbnQgMyAoIiRrJCIpDQoNClRoaXMgaXMgdGhlIGZvcm11bGEgdXNlZCB0byBjYWxjdWxhdGUgY29tcG9uZW50IDNbXjNdDQoNCjxkZXRhaWxzPjxzdW1tYXJ5PlNob3cgYWxsIHRoZSBkZXRhaWxzPC9zdW1tYXJ5Pg0KXGJlZ2lue2VxdWF0aW9ufQ0KayA9IFIgXHRpbWVzIFggICsgKDEgLSBSKSBcdGltZXMgWA0KXGxhYmVse2VxOjV9DQpcdGFnezV9DQpcZW5ke2VxdWF0aW9ufQ0KDQpXaGVyZToNCg0KLSAkayQ6IG9uZS1saW5lciB0byBkZWZpbmUgaw0KLSAkUiQ6IG9uZS1saW5lciB0byBkZWZpbmUgUg0KDQoNCmBgYHtyIGNvbXAzLCAgZWNobz1wcmludF9jb2RlLCBldmFsPVRSVUV9DQojIC0gaW5wdXRzOiBmYWN0b3JzIG9mIHENCiMgLSBvdXRwdXRzOiBxIHZhbHVlDQpjaHVua19rIDwtIGZ1bmN0aW9uKCl7DQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICANCg0KICAgIGtfZnVuY3Rpb25fZiA8LSBmdW5jdGlvbihrX2lucHV0MV92YXIgPSBrX2lucHV0MV9zbyAsIGtfaW5wdXQyX3ZhciA9IGtfaW5wdXQyX3NvKSB7ICANCiAgICAgICAgKGtfaW5wdXQxX3ZhciAqIGtfaW5wdXQyX3ZhcileMg0KICAgICAgICANCiAgICB9DQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIA0KICAgIHJldHVybihsaXN0KCJrX2Z1bmN0aW9uX2YiID0ga19mdW5jdGlvbl9mKSkNCn0NCg0KaW52aXNpYmxlKCBsaXN0MmVudihjaHVua19rKCksLkdsb2JhbEVudikgKQ0KDQoNCmBgYA0KDQo8L2RldGFpbHM+DQojIyBTdW1tYXJ5IG9mIEFsbCBBcHByb2FjaGVzIA0KDQoNCnwgQXBwcm9hY2ggICAgfCBQYXJ0IDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUGFydCAyICAgICAgICB8DQp8LS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS18DQp8IDEuMSB8IFNwZWNpZmljYXRpb24gb2YgQXBwcm9hY2ggMSB3aXRoIFBhcnQgMSBBc3N1bXB0aW9uIDEgfCBTcGVjaWZpY2F0aW9uIG9mIEFwcHJvYWNoIDEgd2l0aCBQYXJ0IDIgQXNzdW1wdGlvbiAxICB8DQp8IDEuMiB8IFNwZWNpZmljYXRpb24gb2YgQXBwcm9hY2ggMSB3aXRoIFBhcnQgMSBBc3N1bXB0aW9uIDIgfCBTcGVjaWZpY2F0aW9uIG9mIEFwcnJvYWNoIDEgd2l0aCBQYXJ0IDIgQXNzdW1wdGlvbiAyICB8DQp8IDIuMSB8IFNwZWNpZmljYXRpb24gb2YgQXBwcm9hY2ggMiB3aXRoIFBhcnQgMSBBc3N1bXB0aW9uIDEgfCBTcGVjaWZpY2F0aW9uIG9mIEFwcHJvYWNoIDIgd2l0aCBQYXJ0IDIgQXNzdW1wdGlvbiAxIHwNCnwgKioyLjIqKiB8ICoqU3BlY2lmaWNhdGlvbiBvZiBBcHByb2FjaCAyIHdpdGggUGFydCAxIEFzc3VtcHRpb24gMioqIHwgKipTcGVjaWZpY2F0aW9uIG9mIEFwcHJvYWNoIDIgd2l0aCBQYXJ0IDIgQXNzdW1wdGlvbiAyKip8DQoNCkJvbGRlZCByb3cgaXMgdGhlIGFzc3VtcHRpb25zIGFuZCB0aGUgYXBwcm9hY2ggd2UgdXNlIHRvIGdlbmVyYXRlIHRoZSBtYWluIHBvbGljeSBlc3RpbWF0ZSBwbG90LiANCg0KDQojIE1haW4gcmVzdWx0cw0KPGRldGFpbHM+PHN1bW1hcnk+U2hvdyBhbGwgdGhlIGRldGFpbHM8L3N1bW1hcnk+DQpgYGB7ciBhbGwtc3RlcHMsICBlY2hvPXByaW50X2NvZGUsIGV2YWwgPSBUUlVFfQ0KI3VuaXQgdGVzdCBmdW5jdGlvbg0KdW5pdF90ZXN0X2YgPC0gZnVuY3Rpb24odG9fdGVzdF92YXIsIG9yaWdpbmFsX3ZhciwgbWFpbl9ydW5fdmFyID0gVFJVRSl7DQogICAgaWYgKG1haW5fcnVuX3ZhciA9PSBUUlVFKSB7DQogICAgICAgIGlmIChsZW5ndGgodG9fdGVzdF92YXIpID4gMSkgew0KICAgICAgICAgICAgZmFpbHNfdGVzdCA8LSAoIGFicyhzZCh0b190ZXN0X3ZhcikgLSBvcmlnaW5hbF92YXIpID4gMC4wMDAxICkNCiAgICAgICAgICAgIHRleHRfdmFsIDwtIHNkKHRvX3Rlc3RfdmFyKQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgZmFpbHNfdGVzdCA8LSAoIGFicyh0b190ZXN0X3ZhciAtIG9yaWdpbmFsX3ZhcikgPiAwLjAwMDEgKQ0KICAgICAgICAgICAgdGV4dF92YWwgPC0gdG9fdGVzdF92YXINCiAgICAgICAgfQ0KICAgICAgICBpZiAoZmFpbHNfdGVzdCkgew0KICAgICAgICAgICAgcHJpbnQocGFzdGUoIk91dHB1dCBoYXMgY2hhbmdlIGF0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgIGRlcGFyc2Uoc3Vic3RpdHV0ZSh0b190ZXN0X3ZhcikgKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICIgdG8gIiwgdGV4dF92YWwpICkNCiAgICAgICAgfQ0KICAgICAgfQ0KfQ0KDQpvbmVfcnVuIDwtIA0KICBmdW5jdGlvbihyX2lucHV0MV92YXIxID0gcl9pbnB1dDFfc28sIA0KICAgICAgICAgICByX2lucHV0Ml92YXIxID0gcl9pbnB1dDJfc28sIA0KICAgICAgICAgICBxX2lucHV0MV92YXIxID0gcV9pbnB1dDFfc28sDQogICAgICAgICAgIHFfaW5wdXQyX3ZhcjEgPSBxX2lucHV0Ml9zbywNCiAgICAgICAgICAga19pbnB1dDFfdmFyMSA9IGtfaW5wdXQxX3NvLA0KICAgICAgICAgICBrX2lucHV0Ml92YXIxID0ga19pbnB1dDJfc28peyMgVmFyaWFibGVzIG5lZWRlZCB0byBnZW5lcmF0ZSB0aGUgZmluYWwgcG9saWN5IGVzdGltYXRlcw0KICAgIA0KICAgIHJfaW4gPC0gcl9mdW5jdGlvbl9mKHJfaW5wdXQxX3ZhciA9IHJfaW5wdXQxX3ZhcjEsDQogICAgICAgICAgICAgICAgICAgICAgICAgcl9pbnB1dDJfdmFyID0gcl9pbnB1dDJfdmFyMSkNCiAgICBxX2luIDwtIHFfZnVuY3Rpb25fZihxX2lucHV0MV92YXIgPSBxX2lucHV0MV92YXIxLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHFfaW5wdXQyX3ZhciA9IHFfaW5wdXQyX3ZhcjEpDQogICAga19pbiA8LSBrX2Z1bmN0aW9uX2Yoa19pbnB1dDFfdmFyID0ga19pbnB1dDFfdmFyMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBrX2lucHV0Ml92YXIgPSBrX2lucHV0Ml92YXIxKQ0KICAgIHJldHVybiAobGlzdCgicl9pbiIgPSByX2luLA0KICAgICAgICAgICAgICAgICAicV9pbiIgPSBxX2luLA0KICAgICAgICAgICAgICAgICAia19pbiIgPSBrX2luKSkNCiAgICAgICAgICAgfQ0KICAgIA0KaW52aXNpYmxlKGxpc3QyZW52KG9uZV9ydW4oKSwgLkdsb2JhbEVudikpDQoNCiAgICANCmBgYA0KDQo8L2RldGFpbHM+DQpgYGB7ciBtYWluLXJlc3VsdHMsICBlY2hvPXByaW50X2NvZGUsIGV2YWwgPSBUUlVFfQ0KIyAtIHBlcmZvcm0gdGhlIGNhbGN1bGF0aW9ucyB0byBhY2hpZXZlIGZpbmFsIHJlc3VsdHMNCg0KcmVzdWx0MSA8LSBtYWluZXF1YXRpb25fZihyX2ZpbmFsX3ZhciA9IHJfaW4sDQogICAgICAgICAgICAgICAgICAgICAgICAgIHFfZmluYWxfdmFyID0gcV9pbiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAga19maW5hbF92YXIgPSBrX2luKQ0KcmVzdWx0MiA8LSBhbHRlcm5hdGl2ZV9mKHJfZmluYWxfdmFyID0gcl9pbiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgcV9maW5hbF92YXIgPSBxX2luLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBrX2ZpbmFsX3ZhciA9IGtfaW4pDQojLi4uDQoNCnJlc3VsdHNfdGFibGUgPC0gZGF0YS5mcmFtZSgicmVzdWx0czEiID0gICBjKCJyZXN1bHRzIiwgTkEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQSkgLA0KICAgICAgICAgICAgICAgICAgICAgICAgInJlc3VsdHMyIiA9ICBjKE5BLCAicmVzdWx0cyIsIE5BKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXN1bHRzMyIgPSBjKCJyZXN1bHRzIiwgTkEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVzdWx0cyIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICByb3cubmFtZXMgPSBjKCJzaXR1YXRpb24xIiwgInNpdHVhdGlvbjIiLCAic2l0dWF0aW9uMyIpKQ0KDQprYWJsZShyZXN1bHRzX3RhYmxlLCBjYXB0aW9uID0gIlRhYmxlIENhcHRpb24iKSAlPiUNCiAga2FibGVfc3R5bGluZygic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBGKQ0KYGBgDQoNCg0KYGBge3IgZ2VuZXJhdGUtcGxvdC1mdW5jdGlvbiwgcHVybCA9IFRSVUUsIGVjaG8gPSBGQUxTRX0NCiMgZ2VuZXJhdGVfcGxvdF9mOiBmdW5jdGlvbiB0byBnZW5lcmF0ZSBwbG90cyBmb3IgYm90aCBEeW5hbWljIERvY3VtZW50IGFuZA0KIyBzaGlueSBhcHAuIEl0IHRha2VzIGluIHRoZSBzaW11bGF0ZWQgZGF0YSwgcG9saWN5IGVzdGltYXRlIHRleHQsIGFuZCByZXNjYWxlDQojIHZhcmlhYmxlLiBUaGVzZSBhcmUgaW50ZXJtZWRpYXJ5IHZhcmlhYmxlcyB0byBleGNsdWRlIHRoZSBpbnRlcmFjdGl2aXR5IG9mDQojIHNoaW55IGFwcCBmcm9tIHRoZSBwbG90IGdlbmVyYXRpb24gcHJvY2Vzcy4gIA0KY2h1bmtfZ2VuZXJhdGVfcGxvdCA8LSBmdW5jdGlvbigpIHsNCiAgZ2VuZXJhdGVfcGxvdF9mIDwtIGZ1bmN0aW9uKHJlc3VsdDFfc2ltX2FsbCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbGljeV9lc3RpbWF0ZXNfdGV4dF9zZWxlY3RlZCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2NhbGUsIFNEID0gRkFMU0Upew0KICAgIHRvdGFsX3RpbWVfc2ltIDwtIHJlc3VsdDFfc2ltX2FsbCR0b3RhbF90aW1lX3NpbQ0KICAgIHBvc2l0aW9uIDwtIHdoaWNoKCBwb2xpY3lfZXN0aW1hdGVzX3RleHQgPT0gcG9saWN5X2VzdGltYXRlc190ZXh0X3NlbGVjdGVkKQ0KICAgIHJlc3VsdDFfc2ltIDwtIHJlc3VsdDFfc2ltX2FsbFtbIHBvbGljeV9lc3RpbWF0ZXNfdmFybmFtZXNbcG9zaXRpb25dIF1dICAgIA0KICAgIHJlc3VsdDFfZm9yX3RleHQgPC0gcGFzdGUoIk1lZGlhbiBOUFY6ICIsIHJvdW5kKG1lZGlhbihyZXN1bHQxX3NpbSksIDIpKQ0KICAgIHJlc3VsdDFfZm9yX3RleHQyIDwtIE5VTEwNCiAgICBpZiAoU0Qpew0KICAgIHJlc3VsdDFfZm9yX3RleHQyIDwtIHBhc3RlKCJTRCBOUFY6ICIsIHJvdW5kKHNkKHJlc3VsdDFfc2ltKSwgMikpDQogICAgfQ0KICAgIHBsb3QxIDwtIGdncGxvdCgpICsNCiAgICAgIGdlb21fZGVuc2l0eSgNCiAgICAgICAgYWVzKHggPSByZXN1bHQxX3NpbSwNCiAgICAgICAgICAgIGFscGhhID0gMSAvIDIsIC4uc2NhbGVkLi4pLA0KICAgICAgICBrZXJuZWwgPSAiZ2F1IiwNCiAgICAgICAgbHdkID0gMSwNCiAgICAgICAgZmlsbCA9ICIjMDA3YmE3IiwNCiAgICAgICAgY29sb3IgPSAiZGFya2JsdWUiLA0KICAgICAgICBhbHBoYSA9IDAuMw0KICAgICAgKSArDQogICAgICBnZW9tX3ZsaW5lKA0KICAgICAgICB4aW50ZXJjZXB0ID0gYygwLCBtZWRpYW4ocmVzdWx0MV9zaW0pKSwNCiAgICAgICAgY29sID0gYygiYmxhY2siLCAiZGFya2JsdWUiKSwNCiAgICAgICAgbHdkID0gYygxLCAxKSwNCiAgICAgICAgbGluZXR5cGUgPSBjKCJzb2xpZCIsICJkYXNoZWQiKQ0KICAgICAgKSArDQogICAgICBjb29yZF9jYXJ0ZXNpYW4oeGxpbSA9IGMoLTMwMCwxMDAwKSwgIHlsaW0gPSAgYyggMCwgMS4yICkpICArICAjIGZpeGluZyB0aGUgeCBheGlzIHNvIHNoaWZ0cyBpbiB0aGUgZGVuc2l0eSBjYW4gYmUgc2Vlbg0KICAgICAgI3hsaW0ocmFuZ2UoZGVuc2l0eShyZXN1bHQxX3NpbSkkeCkpICsNCiAgICAgIGd1aWRlcyhhbHBoYSA9ICJub25lIiwgY29sb3VyID0gIm5vbmUiKSArDQogICAgICBzY2FsZV94X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAsIDApKSkgKw0KICAgICAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLCAwKSkpICsNCiAgICAgIGFubm90YXRlKA0KICAgICAgICAidGV4dCIsDQogICAgICAgIHggPSAxICogbWVkaWFuKHJlc3VsdDFfc2ltKSwNCiAgICAgICAgeSA9IDAuMiwNCiAgICAgICAgbGFiZWwgPSByZXN1bHQxX2Zvcl90ZXh0LA0KICAgICAgICBzaXplID0gNiwNCiAgICAgICAgY29sb3IgPSAiZGFya2JsdWUiDQogICAgICApICsNCiAgICAgIGFubm90YXRlKA0KICAgICAgICAidGV4dCIsDQogICAgICAgIHggPSAxICogbWVkaWFuKHJlc3VsdDFfc2ltKSwNCiAgICAgICAgeSA9IDAuMSwNCiAgICAgICAgbGFiZWwgPSByZXN1bHQxX2Zvcl90ZXh0MiwNCiAgICAgICAgc2l6ZSA9IDYsDQogICAgICAgIGNvbG9yID0gImRhcmtibHVlIg0KICAgICAgKSArDQogICAgICB0aGVtZSgNCiAgICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNCksDQogICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSwNCiAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMS41KQ0KICAgICAgKQ0KDQogICAgaWYgKHJlc2NhbGUgPT0gVFJVRSkgew0KICAgICAgcGxvdDEgPC0NCiAgICAgICAgc3VwcHJlc3NNZXNzYWdlcyhwbG90MSArIGNvb3JkX2NhcnRlc2lhbih4bGltID0gMS4yICogYyhtaW4oYygNCiAgICAgICAgICAtMSwgcmVzdWx0MV9zaW0NCiAgICAgICAgKSksIG1heChjKA0KICAgICAgICAgIDEwMCwgcmVzdWx0MV9zaW0NCiAgICAgICAgKSkpKSkNCiAgICB9DQogICAgcmV0dXJuIChsaXN0KHBsb3QxLHBvc2l0aW9uLHRvdGFsX3RpbWVfc2ltKSkNCn0NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KcmV0dXJuKGxpc3QoImdlbmVyYXRlX3Bsb3RfZiIgPSBnZW5lcmF0ZV9wbG90X2YpKQ0KfQ0KDQppbnZpc2libGUoIGxpc3QyZW52KGNodW5rX2dlbmVyYXRlX3Bsb3QoKSwuR2xvYmFsRW52KSApDQpgYGANCg0KIyBNb250ZSBDYXJsbyBTaW11bGF0aW9ucyAgDQpgYGB7ciBtYy1zZXR1cCwgIGVjaG89cHJpbnRfY29kZSwgZXZhbCA9IFRSVUV9DQoNCnNpbV9kYXRhMV9mIDwtIGZ1bmN0aW9uKG5zaW1zID0gMWUyLA0KICAgICAgICAgICAgICAgICAgICAgIHJfaW5wdXQxX3ZhcjIsDQogICAgICAgICAgICAgICAgICAgICAgcl9pbnB1dDFfdmFyMl9zZCwNCiAgICAgICAgICAgICAgICAgICAgICByX2lucHV0Ml92YXIyLA0KICAgICAgICAgICAgICAgICAgICAgIHJfaW5wdXQyX3ZhcjJfc2QsDQogICAgICAgICAgICAgICAgICAgICAgcV9pbnB1dDFfdmFyMiwNCiAgICAgICAgICAgICAgICAgICAgICBxX2lucHV0MV92YXIyX3NkLA0KICAgICAgICAgICAgICAgICAgICAgIHFfaW5wdXQyX3ZhcjIsDQogICAgICAgICAgICAgICAgICAgICAgcV9pbnB1dDJfdmFyMl9zZCwNCiAgICAgICAgICAgICAgICAgICAgICBrX2lucHV0MV92YXIyLA0KICAgICAgICAgICAgICAgICAgICAgIGtfaW5wdXQxX3ZhcjJfc2QsDQogICAgICAgICAgICAgICAgICAgICAga19pbnB1dDJfdmFyMiwNCiAgICAgICAgICAgICAgICAgICAgICBrX2lucHV0Ml92YXIyX3NkKXsNCiAgICAjIyMjIyMjIyMjIyMjIyMjDQogICAgIyMjIyMjIERyYXdzICAgDQogICAgIyMjIyMjIyMjIyMjIyMjIyAgDQogIHN0YXJ0X3RpbWUgPC0gU3lzLnRpbWUoKQ0KICBzZXQuc2VlZCgxNDI4NTcpDQogIHIxX3NpbSA8LSBybm9ybShuID0gbnNpbXMsIG1lYW4gPSByX2lucHV0MV92YXIyLCBzZD0gcl9pbnB1dDFfdmFyMl9zZCkNCiAgcjJfc2ltIDwtIHJub3JtKG4gPSBuc2ltcywgbWVhbiA9IHJfaW5wdXQyX3ZhcjIsIHNkPSByX2lucHV0Ml92YXIyX3NkKQ0KICBxMV9zaW0gPC0gcm5vcm0obiA9IG5zaW1zLCBtZWFuID0gcV9pbnB1dDFfdmFyMiwgc2Q9IHFfaW5wdXQxX3ZhcjJfc2QpDQogIHEyX3NpbSA8LSBybm9ybShuID0gbnNpbXMsIG1lYW4gPSBxX2lucHV0Ml92YXIyLCBzZD0gcV9pbnB1dDJfdmFyMl9zZCkNCiAgazFfc2ltIDwtIHJub3JtKG4gPSBuc2ltcywgbWVhbiA9IGtfaW5wdXQxX3ZhcjIsIHNkPSBrX2lucHV0MV92YXIyX3NkKQ0KICBrMl9zaW0gPC0gcm5vcm0obiA9IG5zaW1zLCBtZWFuID0ga19pbnB1dDJfdmFyMiwgc2Q9IGtfaW5wdXQyX3ZhcjJfc2QpDQogIA0KICANCiAgDQogICAgICAgICAgICAgICAgICAgICAgDQoNCiAgICAjIyMjIyMjIyMjIyMjIyMjDQogICAgIyMjIyMjIFJ1bnMgICAgDQogICAgIyMjIyMjIyMjIyMjIyMjIw0KDQogIHJlc3VsdDFfc2ltIDwtIHJlcChOQSwgbnNpbXMpICNyZXN1bHQxDQogIHJlc3VsdDJfc2ltIDwtIHJlcChOQSwgbnNpbXMpICNyZXN1bHQyDQogIA0KICBmb3IgKGkgaW4gMTpuc2ltcyl7DQogICAgaW52aXNpYmxlKGxpc3QyZW52KA0KICAgICAgb25lX3J1bihyX2lucHV0MV92YXIxID0gcjFfc2ltW2ldLA0KICAgICAgICAgICAgICByX2lucHV0Ml92YXIxID0gcjJfc2ltW2ldLA0KICAgICAgICAgICAgICBxX2lucHV0MV92YXIxID0gcTFfc2ltW2ldLA0KICAgICAgICAgICAgICBxX2lucHV0Ml92YXIxID0gcTJfc2ltW2ldLA0KICAgICAgICAgICAgICBrX2lucHV0MV92YXIxID0gazFfc2ltW2ldLA0KICAgICAgICAgICAgICBrX2lucHV0Ml92YXIxID0gazJfc2ltW2ldDQogICAgICAgICAgICAgICksIC5HbG9iYWxFbnYpKQ0KICAgIA0KICAgIHJlc3VsdDFfc2ltW2ldIDwtIG1haW5lcXVhdGlvbl9mKHJfZmluYWxfdmFyID0gcl9pbiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgcV9maW5hbF92YXIgPSBxX2luLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBrX2ZpbmFsX3ZhciA9IGtfaW4pDQogICAgcmVzdWx0Ml9zaW1baV0gPC0gYWx0ZXJuYXRpdmVfZihyX2ZpbmFsX3ZhciA9IHJfaW4sDQogICAgICAgICAgICAgICAgICAgICAgICAgIHFfZmluYWxfdmFyID0gcV9pbiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAga19maW5hbF92YXIgPSBrX2luKQ0KICB9DQogICAgdG90YWxfdGltZSA8LSBTeXMudGltZSgpIC0gc3RhcnRfdGltZQ0KICAgIHJldHVybihsaXN0KCJyZXN1bHQxX3NpbSIgPSByZXN1bHQxX3NpbSwNCiAgICAgICAgICAgICAgICAicmVzdWx0Ml9zaW0iID0gcmVzdWx0Ml9zaW0pKQ0KICANCiAgDQp9DQoNCnBvbGljeV9lc3RpbWF0ZXNfdmFybmFtZXMgPC0gYygNCiAgInJlc3VsdDFfc2ltIiwNCiAgInJlc3VsdDJfc2ltIg0KKQ0KDQpwb2xpY3lfZXN0aW1hdGVzX3RleHQgPC0gYygNCiAgIk1haW4gRXF1YXRpb24iLA0KICAiQWx0ZXJuYXRpdmUgRXF1YXRpb24iDQopDQoNCmBgYA0KDQpgYGB7ciBtYy1ydW4sIGRwaSA9IDQwMCwgZWNobyA9IHByaW50X2NvZGUsIGV2YWwgPSBUUlVFfQ0KIyBSdW4gTW9udGUgQ2FybG8gc2ltdWxhdGlvbiBmb3Igb3VyIG1haW4gbW9kZWwNCnJlc3VsdDFfc2ltX2FsbCA8LSBzaW1fZGF0YTFfZihuc2ltcyA9IG5zaW1zX3NvLCANCiAgICAgICAgICAgICAgICAgICAgICByX2lucHV0MV92YXIyID0gcl9pbnB1dDFfc28sDQogICAgICAgICAgICAgICAgICAgICAgcl9pbnB1dDFfdmFyMl9zZCA9IHJfaW5wdXQxX3NvICogMC4xLA0KICAgICAgICAgICAgICAgICAgICAgIHJfaW5wdXQyX3ZhcjIgPSByX2lucHV0Ml9zbywNCiAgICAgICAgICAgICAgICAgICAgICByX2lucHV0Ml92YXIyX3NkID0gcl9pbnB1dDJfc28gKiAwLjEsDQogICAgICAgICAgICAgICAgICAgICAgcV9pbnB1dDFfdmFyMiA9IHFfaW5wdXQxX3NvLA0KICAgICAgICAgICAgICAgICAgICAgIHFfaW5wdXQxX3ZhcjJfc2QgPSBxX2lucHV0MV9zbyAqIDAuMSwNCiAgICAgICAgICAgICAgICAgICAgICBxX2lucHV0Ml92YXIyID0gcV9pbnB1dDJfc28sDQogICAgICAgICAgICAgICAgICAgICAgcV9pbnB1dDJfdmFyMl9zZCA9IHFfaW5wdXQyX3NvICogMC4xLA0KICAgICAgICAgICAgICAgICAgICAgIGtfaW5wdXQxX3ZhcjIgPSBrX2lucHV0MV9zbywNCiAgICAgICAgICAgICAgICAgICAgICBrX2lucHV0MV92YXIyX3NkID0ga19pbnB1dDFfc28gKiAwLjEsDQogICAgICAgICAgICAgICAgICAgICAga19pbnB1dDJfdmFyMiA9IGtfaW5wdXQyX3NvLA0KICAgICAgICAgICAgICAgICAgICAgIGtfaW5wdXQyX3ZhcjJfc2QgPSBrX2lucHV0Ml9zbyAqIDAuMQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KDQoNCg0KIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIFJlc3VsdHMvVml6DQojIyMjIyMjIyMjIyMjIyMjDQoNCg0KbGlicmFyeShwbG90bHkpDQoNCg0KcGxvdDEgPC0gZ2VuZXJhdGVfcGxvdF9mKHJlc3VsdDFfc2ltX2FsbCwgcG9saWN5X2VzdGltYXRlX3NvLCByZXNjYWxlX3NvKVtbMV1dICsNCiAgICAgIGxhYnMoeSA9IE5VTEwsDQogICAgICAgeCA9ICJNYWluIEVzdGltYXRlIiAsDQogICAgICAgdGl0bGUgPSAiUHJvamVjdCBUaXRsZSIsDQogICAgICAgc3VidGl0bGUgPSAiRGlzdHJpYnV0aW9uIG9mIEtleSBJbmRpY2F0b3IiDQogICAgICAgKSANCnByaW50KHBsb3QxKQ0KYGBgDQoNCg0KDQoNCiMgUmVmZXJlbmNlcw0KDQoNClteMV06IE5vdGVzIG9mIHJlZmVyZW5jZWQgc2VjdGlvbg0KDQoNClteMl06IE5vdGVzIG9uIHJlZmVyZW5jZWQgc2VjdGlvbg0KDQpbXjNdOiBOb3RlcyBvbiByZWZlcmVuY2VkIHNlY3Rpb24NCg==

An Open Policy Analysis by BITSS
See a full contributors list here
opa@berkeley.edu